/**
 * @(#)ProcedureTypeInfo.java	0.1 Nov 6, 2007
 *
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.wideskill.rpg4ejb3.type;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * @author: Luigi Scarpato <luigi.scarpato at wideskill.com>
 * 
 */
public class ProcedureTypeInfo<P extends Annotation, C extends Annotation>
		extends AbstractTypeInfo<P, C> {

	private Object bean;

	public ProcedureTypeInfo(Object bean) {
		this.bean = bean;
	}

	public AbstractType<P> getProcedureType() {
		Annotation[] annotations = bean.getClass().getAnnotations();

		AbstractType<P> procedureType = createType(annotations);

		return procedureType;
	}

	@Override
	public Iterator<? extends AbstractType<C>> getColumnTypeIterator() {

		return new Iterator<AbstractType<C>>() {
			int i = 0; // next index
			BeanClassInfo beanClassInfo = new BeanClassInfo(bean.getClass());

			Field[] fld = beanClassInfo.getDeclaredFieldsWithAnnotations(BrandType.class);

			int remainingPrefixes = fld.length; // number of

			public boolean hasNext() {
				return (remainingPrefixes > 0);
			}

			public AbstractType<C> next() {
				if (remainingPrefixes-- == 0)
					throw new NoSuchElementException("No more column type");

				Field field = fld[i++];

				if (field != null) {
					Annotation[] annotations = beanClassInfo.getAnnotations(field);
					AbstractType<C> columnType = createType(annotations);

					try {
						field.setAccessible(true);
						columnType.setValue(field.get(bean));
						columnType.setField(field);
					} catch (Exception e) {
						// ignore
					}

					return columnType;
				}

				return null;
			}

			public void remove() {
				throw new UnsupportedOperationException();
			}

		};
	}
}
